package com.qiguliuxing.dts.core.util;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.SecureRandom;

public class DESEncryUtils {
    /** 
     * 数据加密，算法（DES） 
     * 
     * @param data 
     *            要进行加密的数据 
     *        desKey
     *            秘钥，长度为8的倍数
     * @return 加密后的数据 
     */  
    public static String encryptBasedDes(String data, String desKey) {  
        String encryptedData = null;  
        try {  
            // DES算法要求有一个可信任的随机数源  
            SecureRandom sr = new SecureRandom();  
            DESKeySpec deskey = new DESKeySpec(desKey.getBytes());  
            // 创建一个密匙工厂，然后用它把DESKeySpec转换成一个SecretKey对象  
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
            SecretKey key = keyFactory.generateSecret(deskey);  
            // 加密对象  
            Cipher cipher = Cipher.getInstance("DES");  
            cipher.init(Cipher.ENCRYPT_MODE, key, sr);  
            // 加密，并把字节数组编码成字符串  
            encryptedData = new sun.misc.BASE64Encoder().encode(cipher.doFinal(data.getBytes()));  
        } catch (Exception e) {  
//            log.error("加密错误，错误信息：", e);  
            throw new RuntimeException("加密错误，错误信息：", e);  
        }  
        return encryptedData;  
    }  
    
    /** 
     * 数据解密，算法（DES） 
     * 
     * @param cryptData 
     *            加密数据 
     *        desKey
     *            秘钥，长度为8的倍数
     * @return 解密后的数据 
     */  
    public static String decryptBasedDes(String cryptData, String desKey) {  
        String decryptedData = null;  
        try {  
            // DES算法要求有一个可信任的随机数源  
            SecureRandom sr = new SecureRandom();  
            DESKeySpec deskey = new DESKeySpec(desKey.getBytes());  
            // 创建一个密匙工厂，然后用它把DESKeySpec转换成一个SecretKey对象  
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
            SecretKey key = keyFactory.generateSecret(deskey);  
            // 解密对象  
            Cipher cipher = Cipher.getInstance("DES");  
            cipher.init(Cipher.DECRYPT_MODE, key, sr);  
            // 把字符串解码为字节数组，并解密  
            decryptedData = new String(cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(cryptData)));  
        } catch (Exception e) {  
//            log.error("解密错误，错误信息：", e);  
            throw new RuntimeException("解密错误，错误信息：", e);  
        }  
        return decryptedData;  
    }  
    
    public static void main(String[] args){
    	String data = "234asdf@#WD";
    	String desKey = "passporttokendeskey";

    	String securityStr = encryptBasedDes(data, desKey);
    	System.out.println("加密后数据： " + securityStr);
    	String dncryptStr = decryptBasedDes(securityStr, desKey);
    	System.out.println("解密后数据：" + dncryptStr);
    }
}
